#include <stdio.h>

int main(int argc, const char *argv[])
{
	// 使用字符串有两种方式
	// 方式1  使用数组保存
	// 这种写法 buff1 被定义在栈区 并且使用字符串常量区的 "beijing" 
	// 来初始化数组 buff1 ，后面通过 buff1 访问是 访问的都是战区数组中的内容
	char buff1[20] = "beijing";
	printf("buff1 = [%s]\n", buff1); // beijing
	buff1[0] = 'B'; // 栈区的内容允许修改
	printf("buff1 = [%s]\n", buff1); // Beijing
	
	// 这种方式 定义的多个数组 即使保存的是同一个字符串 数组的首地址也不一样
	char buff2[20] = "beijing";
	printf("buff1 = %p   buff2 = %p\n", buff1, buff2); // 不一样的

	printf("------------------------------\n");

	// 方式2  使用指针处理
	// 这种方式 不能通过 p 取修改字符串  
	// 因为字符串常量在ro段 是 只读的 不允许被修改
	char *p1 = "china";
	printf("p1 = [%s]\n", p1); // china
	// p1[0] = 'C'; // 执行会段错误
	
	// 这种方式 不管定义多少个指针 只要指向同一个字符串常量
	// 那么他们保存的地址都是一样的
	char *p2 = "china";
	printf("p1 = %p   p2 = %p\n", p1, p2);


	return 0;
}
